Покажите, как программно изменить диапазон и цвет датчика

Я хочу динамически обновлять диапазон цветных шагов датчика. Датчик:

var humidityData = [
  {
    domain: { x: [0, 1], y: [0, 1] },
    value: 0,
    title: { text: "Feuchtigkeit" },
    type: "indicator",
    mode: "gauge+number+delta",
    delta: { reference: 69 },
    gauge: {
      axis: { range: [40, 103] },
      steps: [
        { range: [10, 65], color: "red" },
        { range: [65, 68], color: "yellow" },
        { range: [68, 75], color: "lightgreen" },
        { range: [75, 78], color: "yellow" },
        { range: [78, 103], color: "red" },
      ],
    },
  },
];

Но следующее не обновляет диапазоны:

if (temperature_soll!=20) {
    var temp_soll = ((20*1.8)+32)
    var temperature_update = {
      value: temperature,
      'delta.reference': temp_soll,
      'gauge.axis.range': [((10*1.8)+32), ((30*1.8)+32)],
      'gauge.steps.range': [((10*1.8)+32), ((15*1.8)+32)], color:"red",
      'gauge.steps.range': [((15*1.8)+32), ((18*1.8)+32)], color: "yellow",
      'gauge.steps.range': [((18*1.8)+32), ((22*1.8)+32)], color: "lightgreen",
      'gauge.steps.range': [((22*1.8)+32), ((25*1.8)+32)], color: "yellow",
      'gauge.steps.range': [((25*1.8)+32), ((30*1.8)+32)], color: "red",
    };
  };

Цветовые диапазоны остались прежними:

В моем предыдущем посте речь шла о вложенных значениях. Кажется, здесь что-то то же самое, но по-другому. Любой намек на это был бы хорош.

С уважением Откровенный

Для лучшего понимания вот полный файл main.js:

var temperatureHistoryDiv = document.getElementById("temperature-history");
var humidityHistoryDiv = document.getElementById("humidity-history");

var temperatureGaugeDiv = document.getElementById("temperature-gauge");
var humidityGaugeDiv = document.getElementById("humidity-gauge");

// History Data
var temperatureTrace = {
  x: [],
  y: [],
  name: "Temperatur",
  mode: "lines+markers",
  type: "line",
};
var humidityTrace = {
  x: [],
  y: [],
  name: "Feuchtigkeit",
  mode: "lines+markers",
  type: "line",
};

var temperatureLayout = {
  autosize: false,
  title: {
    text: "Temperatur",
  },
  font: {
    size: 14,
    color: "#7f7f7f",
  },
  colorway: ["#B22222"],
  width: 450,
  height: 260,
  margin: { t: 30, b: 20, pad: 5 },
};
var humidityLayout = {
  autosize: false,
  title: {
    text: "Feuchtigkeit",
  },
  font: {
    size: 14,
    color: "#7f7f7f",
  },
  colorway: ["#00008B"],
  width: 450,
  height: 260,
  margin: { t: 30, b: 20, pad: 5 },
};

Plotly.newPlot(temperatureHistoryDiv, [temperatureTrace], temperatureLayout);
Plotly.newPlot(humidityHistoryDiv, [humidityTrace], humidityLayout);

// Gauge Data
var temperatureData = [
  {
    domain: { x: [0, 1], y: [0, 1] },
    value: 0,
    title: { text: "Temperatur" },
    type: "indicator",
    mode: "gauge+number+delta",
    delta: { reference: 20 },
    gauge: {
      axis: { range: [10, 30] },
      steps: [
        { range: [10, 15], color: "red" },
        { range: [15, 18], color: "yellow" },
        { range: [18, 22], color: "lightgreen" },
        { range: [22, 25], color: "yellow" },
        { range: [25, 30], color: "red" },
      ],
    },
  },
];

var humidityData = [
  {
    domain: { x: [0, 1], y: [0, 1] },
    value: 0,
    title: { text: "Feuchtigkeit" },
    type: "indicator",
    mode: "gauge+number+delta",
    delta: { reference: 69 },
    gauge: {
      axis: { range: [40, 103] },
      steps: [
        { range: [10, 65], color: "red" },
        { range: [65, 68], color: "yellow" },
        { range: [68, 75], color: "lightgreen" },
        { range: [75, 78], color: "yellow" },
        { range: [78, 103], color: "red" },
      ],
    },
  },
];

var layout = { width: 300, height: 250, margin: { t: 0, b: 0, l: 0, r: 0 }};

Plotly.newPlot(temperatureGaugeDiv, temperatureData, layout);
Plotly.newPlot(humidityGaugeDiv, humidityData, layout);

// Will hold the arrays we receive from our BME280 sensor
// Temperature
let newTempXArray = [];
let newTempYArray = [];
// Humidity
let newHumidityXArray = [];
let newHumidityYArray = [];

// The maximum number of data points displayed on our scatter/line graph
let MAX_GRAPH_POINTS = 60;
let ctr = 0;

// Callback function that will retrieve our latest sensor readings and redraw our Gauge with the latest readings
function updateSensorReadings() {
  fetch(`/sensorReadings`)
    .then((response) => response.json())
    .then((jsonResponse) => {
      let temperature_soll = jsonResponse.temperature_soll.toFixed(1);
      let temperature = jsonResponse.temperature.toFixed(1);
      let humidity = jsonResponse.humidity.toFixed(1);
      let humidity_soll = jsonResponse.humidity_soll.toFixed(1);
      

      updateBoxes(temperature, humidity);

      updateGauge(temperature_soll, temperature, humidity, humidity_soll);

      // Update Temperature Line Chart
      updateCharts(
        temperatureHistoryDiv,
        newTempXArray,
        newTempYArray,
        temperature
      );
      // Update Humidity Line Chart
      updateCharts(
        humidityHistoryDiv,
        newHumidityXArray,
        newHumidityYArray,
        humidity
      );
    });
}

function updateBoxes(temperature, humidity, pressure, altitude) {
  let temperatureDiv = document.getElementById("temperature");
  let humidityDiv = document.getElementById("humidity");

  temperatureDiv.innerHTML = temperature + " C";
  humidityDiv.innerHTML = humidity + " %";
}

function updateGauge(temperature_soll, temperature, humidity, humidity_soll) {
  //Celsius values in json
  if (temperature_soll==20) {
    var temperature_update = {
      value: temperature,
      'delta.reference': temperature_soll,
      'gauge.axis': [
        { range: [10, 30] },
      ],
      'gauge.steps': [
        { range: [10, 15], color: "red" },
        { range: [15, 18], color: "yellow" },
        { range: [18, 22], color: "lightgreen" },
        { range: [22, 25], color: "yellow" },
        { range: [25, 30], color: "red" },
      ],
    };
  };
  //Fahrenheit values in json
  if (temperature_soll!=20) {
    //var temp_soll = ((20*1.8)+32)
    var temperature_update = {
      value: temperature,
      'delta.reference': 68,
      'gauge.axis': [
        { range: [50, 86] },
      ],
      'gauge.steps': [
        { range: [50, 59], color: "red" },
        { range: [((15*1.8)+32), ((18*1.8)+32)], color: "yellow" },
        { range: [((18*1.8)+32), ((22*1.8)+32)], color: "lightgreen" },
        { range: [((22*1.8)+32), ((25*1.8)+32)], color: "yellow" },
        { range: [((25*1.8)+32), ((30*1.8)+32)], color: "red" },
      ],
    };
  };
  
  
  var humidity_update = {
    value: humidity,
    'delta.reference': humidity_soll,
  };
  Plotly.update(temperatureGaugeDiv, temperature_update);
  Plotly.update(humidityGaugeDiv, humidity_update);
}

function updateCharts(lineChartDiv, xArray, yArray, sensorRead) {
  if (xArray.length >= MAX_GRAPH_POINTS) {
    xArray.shift();
  }
  if (yArray.length >= MAX_GRAPH_POINTS) {
    yArray.shift();
  }
  xArray.push(ctr++);
  yArray.push(sensorRead);

  var data_update = {
    x: [xArray],
    y: [yArray],
  };

  Plotly.update(lineChartDiv, data_update);
}


// Continuos loop that runs evry 3 seconds to update our web page with the latest sensor readings
(function loop() {
  setTimeout(() => {
    updateSensorReadings();
    loop();
  }, 3000);
})();
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вам нужно перестроить весь объект датчика, на самом деле в вашей ситуации проще всего перестроить трассировку, поскольку у вас есть вся информация для обновления. Вот полный код (он случайным образом переключается между двумя макетами json, которые вы предоставили в комментариях):

var temperatureHistoryDiv = document.getElementById("temperature-history");
var humidityHistoryDiv = document.getElementById("humidity-history");

var temperatureGaugeDiv = document.getElementById("temperature-gauge");
var humidityGaugeDiv = document.getElementById("humidity-gauge");

// History Data
var temperatureTrace = {
  x: [],
  y: [],
  name: "Temperatur",
  mode: "lines+markers",
  type: "line",
};
var humidityTrace = {
  x: [],
  y: [],
  name: "Feuchtigkeit",
  mode: "lines+markers",
  type: "line",
};

var temperatureLayout = {
  autosize: false,
  title: {
    text: "Temperatur",
  },
  font: {
    size: 14,
    color: "#7f7f7f",
  },
  colorway: ["#B22222"],
  width: 450,
  height: 260,
  margin: { t: 30, b: 20, pad: 5 },
};
var humidityLayout = {
  autosize: false,
  title: {
    text: "Feuchtigkeit",
  },
  font: {
    size: 14,
    color: "#7f7f7f",
  },
  colorway: ["#00008B"],
  width: 450,
  height: 260,
  margin: { t: 30, b: 20, pad: 5 },
};

Plotly.newPlot(temperatureHistoryDiv, [temperatureTrace], temperatureLayout);
Plotly.newPlot(humidityHistoryDiv, [humidityTrace], humidityLayout);

// Gauge Data
var temperatureData = [
  {
    domain: { x: [0, 1], y: [0, 1] },
    value: 0,
    title: { text: "Temperatur" },
    type: "indicator",
    mode: "gauge+number+delta",
    delta: { reference: 20 },
    gauge: {
      axis: { range: [10, 30] },
      steps: [
        { range: [10, 15], color: "red" },
        { range: [15, 18], color: "yellow" },
        { range: [18, 22], color: "lightgreen" },
        { range: [22, 25], color: "yellow" },
        { range: [25, 30], color: "red" },
      ],
    },
  },
];

var humidityData = [
  {
    domain: { x: [0, 1], y: [0, 1] },
    value: 0,
    title: { text: "Feuchtigkeit" },
    type: "indicator",
    mode: "gauge+number+delta",
    delta: { reference: 69 },
    gauge: {
      axis: { range: [40, 103] },
      steps: [
        { range: [10, 65], color: "red" },
        { range: [65, 68], color: "yellow" },
        { range: [68, 75], color: "lightgreen" },
        { range: [75, 78], color: "yellow" },
        { range: [78, 103], color: "red" },
      ],
    },
  },
];

var layout = { width: 300, height: 250, margin: { t: 0, b: 0, l: 0, r: 0 }};

Plotly.newPlot(temperatureGaugeDiv, temperatureData, layout);
Plotly.newPlot(humidityGaugeDiv, humidityData, layout);

// Will hold the arrays we receive from our BME280 sensor
// Temperature
let newTempXArray = [];
let newTempYArray = [];
// Humidity
let newHumidityXArray = [];
let newHumidityYArray = [];

// The maximum number of data points displayed on our scatter/line graph
let MAX_GRAPH_POINTS = 60;
let ctr = 0;

// Callback function that will retrieve our latest sensor readings and redraw our Gauge with the latest readings
function updateSensorReadings() {
  // fetch(`/sensorReadings`)
  //   .then((response) => response.json())
  new Promise((resolve, reject) => {
    const json = Math.random() <= 0.5 ? {
      "status":"ok",
      "temperature_soll":68,
      "temperature":76.4240036,
      "humidity":42.64257813,
      "humidity_soll":30
    } : {"status":"ok",
      "temperature_soll":20,
      "temperature":24.71999931,
      "humidity":42.51953125,
      "humidity_soll":30
    };
    
    resolve(json); 
  }).then((jsonResponse) => {
      let temperature_soll = jsonResponse.temperature_soll.toFixed(1);
      let temperature = jsonResponse.temperature.toFixed(1);
      let humidity = jsonResponse.humidity.toFixed(1);
      let humidity_soll = jsonResponse.humidity_soll.toFixed(1);
      

      updateBoxes(temperature, humidity);

      updateGauge(temperature_soll, temperature, humidity, humidity_soll);

      // Update Temperature Line Chart
      updateCharts(
        temperatureHistoryDiv,
        newTempXArray,
        newTempYArray,
        temperature
      );
      // Update Humidity Line Chart
      updateCharts(
        humidityHistoryDiv,
        newHumidityXArray,
        newHumidityYArray,
        humidity
      );
    });
}

function updateBoxes(temperature, humidity, pressure, altitude) {
  let temperatureDiv = document.getElementById("temperature");
  let humidityDiv = document.getElementById("humidity");

  temperatureDiv.innerHTML = temperature + " C";
  humidityDiv.innerHTML = humidity + " %";
}

function updateGauge(temperature_soll, temperature, humidity, humidity_soll) {
  //Celsius values in json
  if (temperature_soll==20) {
    var temperature_update = {
      value: temperature,
      delta: { reference: temperature_soll },
      gauge: {
        axis: { range: [10, 30] },
        steps: [
        { range: [10, 15], color: "red" },
        { range: [15, 18], color: "yellow" },
        { range: [18, 22], color: "lightgreen" },
        { range: [22, 25], color: "yellow" },
        { range: [25, 30], color: "red" },
        ],
      },
    };
  };
  //Fahrenheit values in json
  if (temperature_soll!=20) {
    var temperature_update = {
      value: temperature,
      delta: { reference: 68 },
      gauge: {
        axis: { range: [50, 86] },
        steps: [
          { range: [50, 59], color: "red" },
          { range: [((15*1.8)+32), ((18*1.8)+32)], color: "yellow" },
          { range: [((18*1.8)+32), ((22*1.8)+32)], color: "lightgreen" },
          { range: [((22*1.8)+32), ((25*1.8)+32)], color: "yellow" },
          { range: [((25*1.8)+32), ((30*1.8)+32)], color: "red" },
        ]
      }   
    };
  };
  
  var humidity_update = {
    value: humidity,
    'delta.reference': humidity_soll,
  };
  Plotly.restyle(temperatureGaugeDiv, temperature_update);
  Plotly.update(humidityGaugeDiv, humidity_update);
}

function updateCharts(lineChartDiv, xArray, yArray, sensorRead) {
  if (xArray.length >= MAX_GRAPH_POINTS) {
    xArray.shift();
  }
  if (yArray.length >= MAX_GRAPH_POINTS) {
    yArray.shift();
  }
  xArray.push(ctr++);
  yArray.push(sensorRead);

  var data_update = {
    x: [xArray],
    y: [yArray],
  };

  Plotly.update(lineChartDiv, data_update);
}


// Continuos loop that runs evry 3 seconds to update our web page with the latest sensor readings
(function loop() {
  setTimeout(() => {
    updateSensorReadings();
    loop();
  }, 3000);
})();
<head>
    <script src='https://cdn.plot.ly/plotly-2.32.0.min.js'></script>
</head>

<body>
    <div id='myDiv'></div>
    <div id='temperature'></div>
    <div id='humidity'></div>    
    <div id='temperature-history'></div>
    <div id='humidity-history'></div>  
    <div id='temperature-gauge'></div>
    <div id='humidity-gauge'></div>
</body>

Привет, Эрик, он компилируется без ошибок, но, к сожалению, цветные диапазоны не применяются. Цвета пока не видно. С уважением Фрэнк

venni 11.05.2024 19:46

Я думаю, это потому, что вас вводит в заблуждение ответ в предыдущем посте: вам следует применять обновление с помощью Plotly.update(temperatureGaugeDiv, temperature_update);, а не Plotly.update(temperatureGaugeDiv, [temperature_update]);. Если проблема все еще остается, отредактируйте свое сообщение и добавьте полный код или хотя бы mwe с исходными данными о температуре (не о влажности, потому что я предполагаю, что она принадлежит влажностиGaugeDiv) + обновление графика).

EricLavault 11.05.2024 21:02

Привет, Эрик, я уже упомянул о брекетах и ​​исправил их. В противном случае они вообще не будут обновляться, даже без изменения цветов диапазона. Для лучшего понимания я добавляю полный файл main.js выше. Надеюсь, тогда будет лучше понять...

venni 11.05.2024 21:12

Вот пример строки json (по Фаренгейту): {"status":"ok","temperature_soll":68,"temperature":76.424003‌​6, "humidity":42.6425‌​7813,"humidity_soll"‌​: 30} И один для Цельсия: {"status":"ok","temperature_soll":20,"temperature":24.719999‌​31,"humidity":42.519‌​53125,"humidity_soll‌​":30} Просто для завершения вся информация.

venni 11.05.2024 21:23

Ах, ок, похоже, возникла проблема с переопределяющим синтаксисом вложенных свойств датчика. Однако восстановление трассировки работает нормально, см. исправленный ответ с полностью работоспособным фрагментом кода.

EricLavault 11.05.2024 22:31

Вот и все, Эрик :-) Огромное вам за это спасибо! Ты действительно сделал мой день. Откровенный

venni 11.05.2024 22:47

Другие вопросы по теме