Complex expressions

Here is the list of the most complex expressions used in the code. A complex expression is an expression that requires more than 20 tokens to be build.

Literal arrays are omitted.

File Count Expression
/Theme/basic/sidebar_view.php:1881makeLink(array('text' => dgettext('theme_messages''Bookmarks') . ':<span class="arrow arrow-up pull-right"></span>''class' => array('d-none', !$expanded 'collapsed' ''), 'href' => '#''id' => 'sidebar_user_toggle''data' => array('toggle' => 'collapse''target' => '#sidebar_bookmarks')))
/Lib/misc/nav_functions.php:611makeLink(array('text' => $text'title' => $title'class' => $class'id' => $id'icon' => $icon'href' => $href'path' => $path'active' => $active'data' => $data'style' => $style'attr' => $attr'order' => $order))
/Modules/vis/vis_object.php:181$visualisations = array('realtime' => array('label' => dgettext('vis_messages''RealTime'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1), array('colour'dgettext('vis_messages''colour'), 9'EDC240'), array('kw'dgettext('vis_messages''kW'), 4false),  )), 'rawdata' => array('label' => dgettext('vis_messages''RawData'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1), array('fill'dgettext('vis_messages''fill'), 70), array('colour'dgettext('vis_messages''colour'), 9'EDC240'), array('units'dgettext('vis_messages''units'), 5''), array('dp'dgettext('vis_messages''dp'), 7'2'), array('scale'dgettext('vis_messages''scale'), 6'1'))), 'bargraph' => array('label' => dgettext('vis_messages''BarGraph'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 0), array('colour'dgettext('vis_messages''colour'), 9'EDC240'), array('interval'dgettext('vis_messages''interval'), 7'86400'), array('units'dgettext('vis_messages''units'), 5''), array('dp'dgettext('vis_messages''dp'), 7'1'), array('scale'dgettext('vis_messages''scale'), 6'1'), array('delta'dgettext('vis_messages''delta'), 4'0'), array('mode'dgettext('vis_messages''mode'), 7'0'))), 'zoom' => array('label' => dgettext('vis_messages''Zoom'), 'options' => array(array('power'dgettext('vis_messages''power'), 1), array('kwhd'dgettext('vis_messages''kwhd'), 0), array('currency'dgettext('vis_messages''currency'), 5'&pound;'), array('currency_after_val'dgettext('vis_messages''currency_after_val'), 70), array('pricekwh'dgettext('vis_messages''pricekwh'), 60.14), array('delta'dgettext('vis_messages''delta'), 40))), 'stacked' => array('label' => dgettext('vis_messages''Stacked'), 'options' => array(array('bottom'dgettext('vis_messages''bottom'), 0), array('top'dgettext('vis_messages''top'), 0), array('colourt'dgettext('vis_messages''colourt'), 9'7CC9FF'), array('colourb'dgettext('vis_messages''colourb'), 9'0096FF'), array('delta'dgettext('vis_messages''delta'), 40))), 'stackedsolar' => array('label' => dgettext('vis_messages''StackedSolar'), 'options' => array(array('solar'dgettext('vis_messages''solar'), 0), array('consumption'dgettext('vis_messages''consumption'), 0), array('delta'dgettext('vis_messages''delta'), 40))), 'simplezoom' => array('label' => dgettext('vis_messages''SimpleZoom'), 'options' => array(array('power'dgettext('vis_messages''power'), 1), array('kwhd'dgettext('vis_messages''kwh'), 0), array('delta'dgettext('vis_messages''delta'), 40))), 'orderbars' => array('label' => dgettext('vis_messages''OrderBars'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 0), array('delta'dgettext('vis_messages''delta'), 40))), 'multigraph' => array('label' => dgettext('vis_messages''MultiGraph'), 'action' => 'multigraph''options' => array(array('mid'dgettext('vis_messages''mid'), 8))), 'editrealtime' => array('label' => dgettext('vis_messages''EditRealtime'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1))), 'editdaily' => array('label' => dgettext('vis_messages''EditDaily'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 2))), 'smoothie' => array('label' => dgettext('vis_messages''Smoothie'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1), array('ufac'dgettext('vis_messages''ufac'), 6))), 'compare' => array('label' => dgettext('vis_messages''Compare'), 'action' => 'compare''options' => array(array('feedA'dgettext('vis_messages''Feed A'), 1), array('feedB'dgettext('vis_messages''Feed B'), 1))), 'timecompare' => array('label' => dgettext('vis_messages''Time Comparison'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1), array('fill'dgettext('vis_messages''fill'), 71), array('depth'dgettext('vis_messages''depth'), 73), array('npoints'dgettext('vis_messages''data points'), 7800))), 'timestoredaily' => array('label' => dgettext('vis_messages''Timestore Daily (Deprecated)'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1), array('units'dgettext('vis_messages''units'), 5'kWh'))), 'histgraph' => array('label' => dgettext('vis_messages''Histgraph (Deprecated)'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 3), array('barwidth'dgettext('vis_messages''barwidth'), 750), array('start'dgettext('vis_messages''start'), 70), array('end'dgettext('vis_messages''end'), 70))), 'threshold' => array('label' => dgettext('vis_messages''Threshold (Deprecated)'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 3), array('thresholdA'dgettext('vis_messages''thresholdA'), 6500), array('thresholdB'dgettext('vis_messages''thresholdB'), 62500))), 'orderthreshold' => array('label' => dgettext('vis_messages''OrderThreshold (Deprecated)'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 3), array('power'dgettext('vis_messages''power'), 1), array('thresholdA'dgettext('vis_messages''thresholdA'), 6500), array('thresholdB'dgettext('vis_messages''thresholdB'), 62500))), 'graph' => array('label' => dgettext('vis_messages''Graph (Deprecated)'), 'options' => array(array('feedid'dgettext('vis_messages''feed'), 1))))
/Modules/admin/admin_model.php:4121$mounts[] = array('free' => Admin::formatSize($diskFree), 'total' => Admin::formatSize($diskTotal), 'used' => Admin::formatSize($diskUsed), 'writeload' => $writeloadstr'raw' => $diskPercentRaw'percent' => $diskPercent'table' => $diskPercentTable'mountpoint' => $mountpoint)
/Modules/admin/admin_model.php:3601$sysRam = array('total' => Admin::formatSize($sysTotal), 'used' => Admin::formatSize($sysRamUsed), 'free' => Admin::formatSize($sysFree), 'raw' => $sysRamPercentRaw'percent' => $sysRamPercent'table' => $sysRamPercentTable'swap' => $sysSwap)
/Modules/admin/admin_controller.php:4371$view_data = array('system' => $system'services' => $services'log_enabled' => $settings['log']['enabled'], 'redis_enabled' => $settings['redis']['enabled'], 'mqtt_enabled' => $settings['mqtt']['enabled'], 'emoncms_version' => $emoncms_version'path' => $path'emoncms_logfile' => $emoncms_logfile'update_log_filename' => $update_logfile'redis' => $redis'feed_settings' => $settings['feed'], 'emoncms_modules' => $system['emoncms_modules'], 'php_modules' => Admin::php_modules($system['php_modules']), 'mqtt_version' => Admin::mqtt_version( ), 'rpi_info' => Admin::get_rpi_info( ), 'ram_info' => Admin::get_ram($system['mem_info']), 'disk_info' => Admin::get_mountpoints($system['partitions']))
/Lib/process_old_settings.php:51$settings = array("emoncms_dir" => isset($emoncms_dir) ? $emoncms_dir "/home/pi""openenergymonitor_dir" => isset($openenergymonitor_dir) ? $openenergymonitor_dir "/home/pi""display_errors" => isset($display_errors) ? $display_errors true"updatelogin" => isset($updatelogin) ? $updatelogin false"sql" => array("server" => isset($server) ? $server "localhost""database" => isset($database) ? $database "emoncms""username" => isset($username) ? $username "_DB_USER_""password" => isset($password) ? $password "_DB_PASSWORD_""port" => isset($port) ? $port 3306"dbtest" => isset($dbtest) ? $dbtest true), "redis" => array('enabled' => isset($redis_enabled) ? $redis_enabled false'host' => isset($redis_server["host"]) ? $redis_server["host"] : 'localhost''port' => isset($redis_server["port"]) ? $redis_server["port"] : 6379'auth' => isset($redis_server["auth"]) ? $redis_server["auth"] : '''dbnum' => isset($redis_server["dbnum"]) ? $redis_server["dbnum"] : '''prefix' => isset($redis_server["prefix"]) ? $redis_server["prefix"] : 'emoncms'), "mqtt" => array('enabled' => isset($mqtt_enabled) ? $mqtt_enabled false'host' => isset($mqtt_server["host"]) ? $mqtt_server["host"] : 'localhost''port' => isset($mqtt_server["port"]) ? $mqtt_server["port"] : 1883'user' => isset($mqtt_server["user"]) ? $mqtt_server["user"] : '''password' => isset($mqtt_server["password"]) ? $mqtt_server["password"] : '''basetopic' => isset($mqtt_server["basetopic"]) ? $mqtt_server["basetopic"] : 'emon''client_id' => isset($mqtt_server["client_id"]) ? $mqtt_server["client_id"] : 'emoncms'), "input" => array('max_node_id_limit' => isset($max_node_id_limit) ? $max_node_id_limit 32), "feed" => array('engines_hidden' => isset($feed_settings["engines_hidden"]) ? $feed_settings["engines_hidden"] : array( ), 'redisbuffer' => array('enabled' => isset($feed_settings["redisbuffer"]["enabled"]) ? $feed_settings["redisbuffer"]["enabled"] : false'sleep' => isset($feed_settings["redisbuffer"]["sleep"]) ? $feed_settings["redisbuffer"]["sleep"] : 600), 'phpfiwa' => array('datadir' => isset($feed_settings["phpfiwa"]["datadir"]) ? $feed_settings["phpfiwa"]["datadir"] : '/var/lib/phpfiwa/'), 'phpfina' => array('datadir' => isset($feed_settings["phpfina"]["datadir"]) ? $feed_settings["phpfina"]["datadir"] : '/var/lib/phpfina/'), 'phptimeseries' => array('datadir' => isset($feed_settings["phptimeseries"]["datadir"]) ? $feed_settings["phptimeseries"]["datadir"] : '/var/lib/phptimeseries/'), 'cassandra' => array('keyspace' => isset($feed_settings["cassandra"]["keyspace"]) ? $feed_settings["cassandra"]["keyspace"] : 'emoncms'), 'virtualfeed' => array('data_sampling' => false), 'mysqltimeseries' => array('data_sampling' => false'datadir' => isset($feed_settings["mysql"]["datadir"]) ? $feed_settings["mysql"]["datadir"] : '''prefix' => isset($feed_settings["mysql"]["prefix"]) ? $feed_settings["mysql"]["prefix"] : 'feed_''generic' => isset($feed_settings["mysql"]["generic"]) ? $feed_settings["mysql"]["generic"] : true'database' => isset($feed_settings["mysql"]["database"]) ? $feed_settings["mysql"]["database"] : null'username' => isset($feed_settings["mysql"]["username"]) ? $feed_settings["mysql"]["username"] : null'password' => isset($feed_settings["mysql"]["password"]) ? $feed_settings["mysql"]["password"] : null), 'max_datapoints' => isset($max_datapoints) ? $max_datapoints 8928'csv_decimal_places' => isset($csv_decimal_places) ? $csv_decimal_places 2'csv_decimal_place_separator' => isset($csv_decimal_place_separator) ? $csv_decimal_place_separator "."'csv_field_separator' => isset($csv_field_separator) ? $csv_field_separator ","'csv_downloadlimit_mb' => isset($feed_settings["csv_downloadlimit_mb"]) ? $feed_settings["csv_downloadlimit_mb"] : 25), "interface" => array('appname' => isset($appname) ? $appname "emoncms"'default_language' => isset($default_language) ? $default_language 'en_GB''theme' => isset($theme) ? $theme "basic"'themecolor' => isset($themecolor) ? $themecolor "blue"'favicon' => isset($favicon) ? $favicon "favicon.png"'menucollapses' => isset($menucollapses) ? $menucollapses false'show_menu_titles' => isset($show_menu_titles) ? $show_menu_titles true'default_controller' => isset($default_controller) ? $default_controller "user"'default_action' => isset($default_action) ? $default_action "login"'default_controller_auth' => isset($default_controller_auth) ? $default_controller_auth "feed"'default_action_auth' => isset($default_action_auth) ? $default_action_auth "list"'feedviewpath' => isset($feedviewpath) ? $feedviewpath "vis/auto?feedid="'enable_multi_user' => isset($enable_multi_user) ? $enable_multi_user false'enable_rememberme' => isset($enable_rememberme) ? $enable_rememberme true'enable_password_reset' => isset($enable_password_reset) ? $enable_password_reset false'enable_admin_ui' => isset($allow_emonpi_admin) ? $allow_emonpi_admin false'enable_update_ui' => isset($admin_show_update) ? $admin_show_update true'email_verification' => isset($email_verification) ? $email_verification false), "public_profile" => array('enabled' => isset($public_profile_enabled) ? $public_profile_enabled true'controller' => isset($public_profile_controller) ? $public_profile_controller "dashboard"'action' => isset($public_profile_action) ? $public_profile_action "view"), "smtp" => array('default_emailto' => isset($default_emailto) ? $default_emailto 'root@localhost''host' => isset($smtp_email_settings["host"]) ? $smtp_email_settings["host"] : "smtp.gmail.com"'port' => isset($smtp_email_settings["port"]) ? $smtp_email_settings["port"] : "465"'from_email' => isset($smtp_email_settings["from_email"]) ? $smtp_email_settings["from_email"] : 'noreply@emoncms.org''from_name' => isset($smtp_email_settings["from_name"]) ? $smtp_email_settings["from_name"] : 'EmonCMS''encryption' => isset($smtp_email_settings["encryption"]) ? $smtp_email_settings["encryption"] : "ssl"'username' => isset($smtp_email_settings["username"]) ? $smtp_email_settings["username"] : "yourusername@gmail.com"'password' => isset($smtp_email_settings["password"]) ? $smtp_email_settings["password"] : "yourpassword"), "log" => array("enabled" => isset($log_enabled) ? $log_enabled true"location" => isset($log_location) ? $log_location "/var/log/emoncms""level" => isset($log_level) ? $log_level 2))
/Modules/admin/admin_controller.php:4202$services[$key] = array('state' => ucfirst($value['ActiveState']), 'text' => ucfirst($value['SubState']), 'cssClass' => $value['SubState'] === 'running' 'success' 'danger''running' => $value['SubState'] === 'running')
/Modules/admin/admin_controller.php:981$view_data = array('system' => $system'services' => $services'admin_show_update' => $settings['interface']['enable_update_ui'], 'shutdownPi' => $shutdownPi'log_enabled' => $settings['log']['enabled'], 'update_log_filename' => $update_logfile'redis_enabled' => $settings['redis']['enabled'], 'mqtt_enabled' => $settings['mqtt']['enabled'], 'emoncms_version' => $emoncms_version'path' => $path'allow_emonpi_admin' => $settings['interface']['enable_admin_ui'], 'emoncms_logfile' => $emoncms_logfile'redis_info' => $redis_info'feed_settings' => $settings['feed'], 'emoncms_modules' => $system['emoncms_modules'], 'php_modules' => Admin::php_modules($system['php_modules']), 'mqtt_version' => Admin::mqtt_version( ), 'rpi_info' => Admin::get_rpi_info( ), 'ram_info' => Admin::get_ram($system['mem_info']), 'disk_info' => Admin::get_mountpoints($system['partitions']), 'v' => 3'log_levels' => $log_levels'log_level' => $settings['log']['level'], 'log_level_label' => $log_levels[$settings['log']['level']])
/Modules/schedule/schedule_processlist.php:321$list = array(array("name" => _("If !schedule, ZERO"), "short" => "!sched 0""argtype" => ProcessArg::SCHEDULEID"function" => "if_not_schedule_zero""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Schedule"), "description" => _("<p>Validates if time is NOT in range of schedule. If NOT in schedule, value is ZEROed.</p><p>You can use this to get a feed for each of the multi-rate tariff rate your provider gives. Add the 'Reset to Original' process before this process to log the input value to a different feed for each schedule on the same processing list</p>")), array("name" => _("If !schedule, NULL"), "short" => "!sched N""argtype" => ProcessArg::SCHEDULEID"function" => "if_not_schedule_null""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Schedule"), "description" => _("<p>Validates if time is NOT in range of schedule. If NOT in schedule, value is NULLed.</p><p>You can use this to get a feed for each of the multi-rate tariff rate your provider gives. Add the 'Reset to Original' process before this process to log the input value to a different feed for each schedule on the same processing list</p>")), array("name" => _("If schedule, ZERO"), "short" => "sched 0""argtype" => ProcessArg::SCHEDULEID"function" => "if_schedule_zero""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Schedule"), "description" => _("<p>Validates if time is in range of schedule. If in schedule, value is ZEROed.</p><p>You can use this to get a feed for each of the multi-rate tariff rate your provider gives. Add the 'Reset to Original' process before this process to log the input value to a different feed for each schedule on the same processing list</p>")), array("name" => _("If schedule, NULL"), "short" => "sched N""argtype" => ProcessArg::SCHEDULEID"function" => "if_schedule_null""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Schedule"), "description" => _("<p>Validates if time is in range of schedule. If in schedule, value is NULLed.</p><p>You can use this to get a feed for each of the multi-rate tariff rate your provider gives. Add the 'Reset to Original' process before this process to log the input value to a different feed for each schedule on the same processing list</p>")))
/Modules/admin/admin_controller.php:722$services[$key] = array('state' => ucfirst($value['ActiveState']), 'text' => ucfirst($value['SubState']), 'cssClass' => $value['SubState'] === 'running' 'success' 'danger''running' => $value['SubState'] === 'running')
/Theme/basic/menu_view.php:291$menu['tabs'][] = array('title' => dgettext('theme_messages''Open/Close Sidebar'), 'id' => 'sidebar-toggle''href' => '#''icon' => 'icon-menu''order' => -1'li_style' => 'width:0; overflow:hidden; visibility:hidden''data' => array('toggle' => 'slide-collapse''target' => '#sidebar'))
/Modules/eventp/eventp_processlist.php:331$list = array(array("name" => _("If rate >=, skip next"), "short" => "?rate>=""argtype" => ProcessArg::VALUE"function" => "ifRateGtEqualSkip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - Event"), "requireredis" => true"nochange" => true"description" => _("<p>If value from last process has an absolute change from previous time it was calculated higher or equal to the specified value, processlist execution will skip the next process.</p>")), array("name" => _("If rate <, skip next"), "short" => "?rate<""argtype" => ProcessArg::VALUE"function" => "ifRateLtSkip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - Event"), "requireredis" => true"nochange" => true"description" => _("<p>If value from last process has an absolute change from previous time it was calculated lower than the specified value, processlist execution will skip the next process.</p>")), array("name" => _("If Mute, skip next"), "short" => "?mute""argtype" => ProcessArg::VALUE"function" => "ifMuteSkip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - Event"), "requireredis" => true"nochange" => true"description" => _("<p>A time elapsed dependent condition, first time a processlist passes here the flow is unchanged. Next times the same processlist passes here, if the specified value time (in seconds) has not elapsed, flow will skip next process.</p>")), array("name" => _("If !Mute, skip next"), "short" => "?!mute""argtype" => ProcessArg::VALUE"function" => "ifNotMuteSkip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - Event"), "requireredis" => true"nochange" => true"description" => _("<p>A time elapsed dependent condition, first time a processlist passes here the flow skips next. Next times the same processlist passes here, if the specified value time (in seconds) has elapsed, flow will skip next process.</p>")), array("name" => _("Send Email"), "short" => "email""argtype" => ProcessArg::TEXT"function" => "sendEmail""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Event"), "nochange" => true"description" => _("<p>Send an email to the user with the specified body. Email sent to user's email address or default set in config.</p><p>Supported template tags to customize body: {type}, {id}, {key}, {name}, {node}, {time}, {value}</p><p>Example body text: At {time} your {type} from {node} with key {key} named {name} had value {value}.</p>")))
/Modules/process/process_processlist.php:691$list = array(array("id_num" => 1"name" => _("Log to feed"), "short" => "log""argtype" => ProcessArg::FEEDID"function" => "log_to_feed""datafields" => 1"datatype" => DataType::REALTIME"unit" => """group" => _("Main"), "engines" => array(Engine::PHPFINAEngine::PHPFIWAEngine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORYEngine::CASSANDRA), "nochange" => true"description" => _("<p><b>Log to feed:</b> This processor logs to a timeseries feed which can then be used to explore historic data. This is recommended for logging power, temperature, humidity, voltage and current data.</p><p><b>Feed engine:</b><ul><li><b>PHPFina</b> is the recommended feed engine it is a basic fixed interval timeseries engine.</li><li><b>PHPTimeseries</b> is for data posted at a non regular interval such as on state change.</li></ul></p><p><b>Feed interval:</b> When selecting the feed interval select an interval that is the same as, or longer than the update rate that is set in your monitoring equipment. Setting the interval rate to be shorter than the update rate of the equipment causes un-needed disk space to be used up.</p>")), array("id_num" => 2"name" => _("x"), "short" => "x""argtype" => ProcessArg::VALUE"function" => "scale""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Calibration"), "description" => _("<p>Multiplies current value by given constant. This can be useful for calibrating a particular variable on the web rather than by reprogramming hardware.</p>")), array("id_num" => 3"name" => _("+"), "short" => "+""argtype" => ProcessArg::VALUE"function" => "offset""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Calibration"), "description" => _("<p>Offset current value by given value. This can again be useful for calibrating a particular variable on the web rather than by reprogramming hardware.</p>")), array("id_num" => 4"name" => _("Power to kWh"), "short" => "kwh""argtype" => ProcessArg::FEEDID"function" => "power_to_kwh""datafields" => 1"datatype" => DataType::REALTIME"unit" => "kWh""group" => _("Main"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p><b>Power to kWh:</b> Convert a power value in Watts to a cumulative kWh feed.<br><br><b>Visualisation tip:</b> Feeds created with this input processor can be used to generate daily kWh data using the BarGraph visualisation with the delta property set to 1. See <a href='https://guide.openenergymonitor.org/setup/daily-kwh/' target='_blank' rel='noopener'>Guide: Daily kWh</a><br><br>")), array("id_num" => 5"name" => _("Power to kWh/d"), "short" => "kwhd""argtype" => ProcessArg::FEEDID"function" => "power_to_kwhd""datafields" => 1"datatype" => DataType::DAILY"unit" => "kWhd""group" => _("Power & Energy"), "engines" => array(Engine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p>Convert a power value in Watts to a feed that contains an entry for the total energy used each day (kWh/d)</p>")), array("id_num" => 6"name" => _("x input"), "short" => "x inp""argtype" => ProcessArg::INPUTID"function" => "times_input""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Input"), "description" => _("<p>Multiplies the current value with the last value from other input as selected from the input list.</p>")), array("id_num" => 7"name" => _("Input on-time"), "short" => "ontime""argtype" => ProcessArg::FEEDID"function" => "input_ontime""datafields" => 1"datatype" => DataType::DAILY"unit" => """group" => _("Input"), "engines" => array(Engine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p>Counts the amount of time that an input is high in each day and logs the result to a feed. Created for counting the number of hours a solar hot water pump is on each day</p>")), array("id_num" => 8"name" => _("Wh increments to kWh/d"), "short" => "whinckwhd""argtype" => ProcessArg::FEEDID"function" => "whinc_to_kwhd""datafields" => 1"datatype" => DataType::DAILY"unit" => "kWhd""group" => _("Power & Energy"), "engines" => array(Engine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p>Accumulate Wh measurements into kWh/d.<p><b>Input</b>: energy increments in Wh.</p>")), array("id_num" => 9"name" => _("kWh to kWh/d (OLD)"), "short" => "kwhkwhdold""argtype" => ProcessArg::FEEDID"function" => "kwh_to_kwhd_old""datafields" => 1"datatype" => DataType::DAILY"unit" => "kWhd""group" => _("Deleted"), "engines" => array(Engine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "description" => _("")), array("id_num" => 10"name" => _("Update feed at day"), "short" => "update""argtype" => ProcessArg::FEEDID"function" => "update_feed_data""datafields" => 1"datatype" => DataType::DAILY"unit" => """group" => _("Input"), "engines" => array(Engine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p>Updates or inserts daily value on the specified time (given by the JSON time parameter from the API) of the specified feed</p>")), array("id_num" => 11"name" => _("+ input"), "short" => "+ inp""argtype" => ProcessArg::INPUTID"function" => "add_input""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Input"), "description" => _("<p>Adds the current value with the last value from other input as selected from the input list. The result is passed back for further processing by the next processor in the processing list.</p>")), array("id_num" => 12"name" => _("/ input"), "short" => "/ inp""argtype" => ProcessArg::INPUTID"function" => "divide_input""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Input"), "description" => _("<p>Divides the current value with the last value from other input as selected from the input list. The result is passed back for further processing by the next processor in the processing list.</p>")), array("id_num" => 13"name" => _("Phaseshift"), "short" => "phaseshift""argtype" => ProcessArg::VALUE"function" => "phaseshift""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Deleted"), "description" => _("")), array("id_num" => 14"name" => _("Accumulator"), "short" => "accumulate""argtype" => ProcessArg::FEEDID"function" => "accumulator""datafields" => 1"datatype" => DataType::REALTIME"unit" => """group" => _("Misc"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "description" => _("<p>Output feed accumulates by input value</p>")), array("id_num" => 15"name" => _("Rate of change"), "short" => "rate""argtype" => ProcessArg::FEEDID"function" => "ratechange""datafields" => 1"datatype" => DataType::REALTIME"unit" => """group" => _("Misc"), "engines" => array(Engine::PHPFIWAEngine::PHPFINAEngine::PHPTIMESERIES), "requireredis" => true"description" => _("<p>Output feed is the difference between the current value and the last</p>")), array("id_num" => 16"name" => _("Histogram"), "short" => "hist""argtype" => ProcessArg::FEEDID"function" => "histogram""datafields" => 2"datatype" => DataType::HISTOGRAM"unit" => """group" => _("Power & Energy"), "engines" => array(Engine::MYSQLEngine::MYSQLMEMORY), "description" => _("Creates a histogram of energy binned by power ranges. For each power range on the x-axis, this processor will aggregate the total energy of the stream while it was in that power range.<p><b>Input</b>: power in Watts.</p>")), array("id_num" => 17"name" => _("Daily Average"), "short" => "mean""argtype" => ProcessArg::FEEDID"function" => "average""datafields" => 2"datatype" => DataType::HISTOGRAM"unit" => """group" => _("Deleted"), "engines" => array(Engine::PHPTIMESERIES), "description" => _("")), array("id_num" => 18"name" => _("Heat flux"), "short" => "flux""argtype" => ProcessArg::FEEDID"function" => "heat_flux""datafields" => 1"datatype" => DataType::REALTIME"unit" => """group" => _("Deleted"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIES), "description" => _("")), array("id_num" => 19"name" => _("Power gained to kWh/d"), "short" => "pwrgain""argtype" => ProcessArg::FEEDID"function" => "power_acc_to_kwhd""datafields" => 1"datatype" => DataType::DAILY"unit" => "kWhd""group" => _("Deleted"), "engines" => array(Engine::PHPTIMESERIES), "description" => _("")), array("id_num" => 20"name" => _("Total pulse count to pulse increment"), "short" => "pulsdiff""argtype" => ProcessArg::FEEDID"function" => "pulse_diff""datafields" => 1"datatype" => DataType::REALTIME"unit" => """group" => _("Pulse"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIES), "description" => _("<p>Returns the number of pulses incremented since the last update for a input that is a cumulative pulse count. i.e If the input updates from 23400 to 23410 the result will be an incremenet of 10.</p>")), array("id_num" => 21"name" => _("kWh to Power"), "short" => "kwhpwr""argtype" => ProcessArg::FEEDID"function" => "kwh_to_power""datafields" => 1"datatype" => DataType::REALTIME"unit" => "W""group" => _("Power & Energy"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIES), "requireredis" => true"description" => _("<p>Convert accumulating kWh to instantaneous power</p>")), array("id_num" => 22"name" => _("- input"), "short" => "- inp""argtype" => ProcessArg::INPUTID"function" => "subtract_input""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Input"), "description" => _("<p>Subtracts from the current value the last value from other input as selected from the input list.</p>")), array("id_num" => 23"name" => _("kWh to kWh/d"), "short" => "kwhkwhd""argtype" => ProcessArg::FEEDID"function" => "kwh_to_kwhd""datafields" => 2"datatype" => DataType::DAILY"unit" => "kWhd""group" => _("Power & Energy"), "engines" => array(Engine::PHPTIMESERIES), "requireredis" => true"nochange" => true"description" => _("<p>Upsert kWh to a daily value.</p>")), array("id_num" => 24"name" => _("Allow positive"), "short" => "> 0""argtype" => ProcessArg::NONE"function" => "allowpositive""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Limits"), "description" => _("<p>Negative values are zeroed for further processing by the next processor in the processing list.</p>")), array("id_num" => 25"name" => _("Allow negative"), "short" => "< 0""argtype" => ProcessArg::NONE"function" => "allownegative""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Limits"), "description" => _("<p>Positive values are zeroed for further processing by the next processor in the processing list.</p>")), array("id_num" => 26"name" => _("Signed to unsigned"), "short" => "unsign""argtype" => ProcessArg::NONE"function" => "signed2unsigned""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => "unsign""group" => _("Misc"), "description" => _("<p>Convert a number that was interpreted as a 16 bit signed number to an unsigned number.</p>")), array("id_num" => 27"name" => _("Max daily value"), "short" => "max""argtype" => ProcessArg::FEEDID"function" => "max_value""datafields" => 1"datatype" => DataType::DAILY"unit" => """group" => _("Misc"), "engines" => array(Engine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p>Maximal daily value. Upserts on the selected daily feed the highest value reached each day.</p>")), array("id_num" => 28"name" => _("Min daily value"), "short" => "min""argtype" => ProcessArg::FEEDID"function" => "min_value""datafields" => 1"datatype" => DataType::DAILY"unit" => """group" => _("Misc"), "engines" => array(Engine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORY), "nochange" => true"description" => _("<p>Minimal daily value. Upserts on the selected daily feed the lowest value reached each day.</p>")), array("id_num" => 29"name" => _("+ feed"), "short" => "+ feed""argtype" => ProcessArg::FEEDID"function" => "add_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Feed"), "description" => _("<p>Adds the current value with the last value from a feed as selected from the feed list.</p>")), array("id_num" => 30"name" => _("- feed"), "short" => "- feed""argtype" => ProcessArg::FEEDID"function" => "sub_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Feed"), "description" => _("<p>Subtracts from the current value the last value from a feed as selected from the feed list.</p>")), array("id_num" => 31"name" => _("* feed"), "short" => "x feed""argtype" => ProcessArg::FEEDID"function" => "multiply_by_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Feed"), "description" => _("<p>Multiplies the current value with the last value from a feed as selected from the feed list.</p>")), array("id_num" => 32"name" => _("/ feed"), "short" => "/ feed""argtype" => ProcessArg::FEEDID"function" => "divide_by_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Feed"), "description" => _("<p>Divides the current value by the last value from a feed as selected from the feed list.</p>")), array("id_num" => 33"name" => _("Reset to ZERO"), "short" => "0""argtype" => ProcessArg::NONE"function" => "reset2zero""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Misc"), "description" => _("<p>The value \"0\" is passed back for further processing by the next processor in the processing list.</p>")), array("id_num" => 34"name" => _("Wh Accumulator"), "short" => "whacc""argtype" => ProcessArg::FEEDID"function" => "wh_accumulator""datafields" => 1"datatype" => DataType::REALTIME"unit" => "Wh""group" => _("Main"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIES), "requireredis" => true"description" => _("<b>Wh Accumulator:</b> Use with emontx, emonth or emonpi pulsecount or an emontx running firmware <i>emonTxV3_4_continuous_kwhtotals</i> sending cumulative watt hours.<br><br>This processor ensures that when the emontx is reset the watt hour count in emoncms does not reset, it also checks filter's out spikes in energy use that are larger than a max power threshold set in the processor, assuming these are error's, the max power threshold is set to 25kW. <br><br><b>Visualisation tip:</b> Feeds created with this input processor can be used to generate daily kWh data using the BarGraph visualisation with the delta property set to 1 and scale set to 0.001. See: <a href='https://guide.openenergymonitor.org/setup/daily-kwh/' target='_blank' rel='noopener'>Guide: Daily kWh</a><br><br>")), array("id_num" => 35"name" => _("Publish to MQTT"), "short" => "MQTT""argtype" => ProcessArg::TEXT"function" => "publish_to_mqtt""datafields" => 1"datatype" => DataType::UNDEFINED"unit" => """group" => _("Misc"), "nochange" => true"description" => _("<p>Publishes value to MQTT topic e.g. 'home/power/kitchen'</p>")), array("id_num" => 36"name" => _("Reset to NULL"), "short" => "null""argtype" => ProcessArg::NONE"function" => "reset2null""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Misc"), "description" => _("<p>Value is set to NULL.</p><p>Useful for conditional process to work on.</p>")), array("id_num" => 37"name" => _("Reset to Original"), "short" => "ori""argtype" => ProcessArg::NONE"function" => "reset2original""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Misc"), "description" => _("<p>The value is set to the original value at the start of the process list.</p>")), array("id_num" => 42"name" => _("If ZERO, skip next"), "short" => "0? skip""argtype" => ProcessArg::NONE"function" => "if_zero_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional"), "nochange" => true"description" => _("<p>If value from last process is ZERO, process execution will skip execution of next process in list.</p>")), array("id_num" => 43"name" => _("If !ZERO, skip next"), "short" => "!0? skip""argtype" => ProcessArg::NONE"function" => "if_not_zero_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional"), "nochange" => true"description" => _("<p>If value from last process is NOT ZERO, process execution will skip execution of next process in list.</p>")), array("id_num" => 44"name" => _("If NULL, skip next"), "short" => "N? skip""argtype" => ProcessArg::NONE"function" => "if_null_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional"), "nochange" => true"description" => _("<p>If value from last process is NULL, process execution will skip execution of next process in list.</p>")), array("id_num" => 45"name" => _("If !NULL, skip next"), "short" => "!N? skip""argtype" => ProcessArg::NONE"function" => "if_not_null_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional"), "nochange" => true"description" => _("<p>If value from last process is NOT NULL, process execution will skip execution of next process in list.</p>")), array("id_num" => 46"name" => _("If >, skip next"), "short" => ">? skip""argtype" => ProcessArg::VALUE"function" => "if_gt_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - User value"), "nochange" => true"description" => _("<p>If value from last process is greater than the specified value, process execution will skip execution of next process in list.</p>")), array("id_num" => 47"name" => _("If >=, skip next"), "short" => ">=? skip""argtype" => ProcessArg::VALUE"function" => "if_gt_equal_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - User value"), "nochange" => true"description" => _("<p>If value from last process is greater or equal to the specified value, process execution will skip execution of next process in list.</p>")), array("id_num" => 48"name" => _("If <, skip next"), "short" => "<? skip""argtype" => ProcessArg::VALUE"function" => "if_lt_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - User value"), "nochange" => true"description" => _("<p>If value from last process is lower than the specified value, process execution will skip execution of next process in list.</p>")), array("id_num" => 49"name" => _("If <=, skip next"), "short" => "<=? skip""argtype" => ProcessArg::VALUE"function" => "if_lt_equal_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - User value"), "nochange" => true"description" => _("<p>If value from last process is lower or equal to the specified value, process execution will skip execution of next process in list.</p>")), array("id_num" => 50"name" => _("If =, skip next"), "short" => "=? skip""argtype" => ProcessArg::VALUE"function" => "if_equal_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - User value"), "nochange" => true"description" => _("<p>If value from last process is equal to the specified value, process execution will skip execution of next process in list.</p>")), array("id_num" => 51"name" => _("If !=, skip next"), "short" => "!=? skip""argtype" => ProcessArg::VALUE"function" => "if_not_equal_skip""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Conditional - User value"), "nochange" => true"description" => _("<p>If value from last process is NOT equal to the specified value, process execution will skip execution of next process in list.</p>")), array("id_num" => 52"name" => _("GOTO"), "short" => "GOTO""argtype" => ProcessArg::VALUE"function" => "goto_process""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Misc"), "nochange" => true"description" => _("<p>Jumps the process execution to the specified position.</p><p><b>Warning</b><br>If you're not careful you can create a goto loop on the process list.<br>When a loop occurs, the API will appear to lock until the server php times out with an error.</p>")), array("id_num" => 53"name" => _("Source Feed"), "short" => "sfeed""argtype" => ProcessArg::FEEDID"function" => "source_feed_data_time""datafields" => 1"datatype" => DataType::UNDEFINED"unit" => """group" => _("Virtual"), "description" => _("<p><b>Source Feed:</b><br>Virtual feeds should use this processor as the first one in the process list. It sources data from the selected feed.<br>The sourced value is passed back for further processing by the next processor in the processing list.<br>You can then add other processors to apply logic on the passed value for post-processing calculations in realtime.</p><p>Note: This virtual feed process list is executed on visualizations requests that use this virtual feed.</p>")), array("id_num" => 55"name" => _("+ source feed"), "short" => "+ sfeed""argtype" => ProcessArg::FEEDID"function" => "add_source_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Virtual"), "description" => _("<p>Add the specified feed.</p>")), array("id_num" => 56"name" => _("- source feed"), "short" => "- sfeed""argtype" => ProcessArg::FEEDID"function" => "sub_source_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Virtual"), "description" => _("<p>Subtract the specified feed.</p>")), array("id_num" => 57"name" => _("* source feed"), "short" => "x sfeed""argtype" => ProcessArg::FEEDID"function" => "multiply_by_source_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Virtual"), "description" => _("<p>Multiply by specified feed.</p>")), array("id_num" => 58"name" => _("/ source feed"), "short" => "/ sfeed""argtype" => ProcessArg::FEEDID"function" => "divide_by_source_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Virtual"), "description" => _("<p>Divide by specified feed. Returns NULL for zero values.</p>")), array("id_num" => 59"name" => _("/ source feed"), "short" => "/ sfeed""argtype" => ProcessArg::FEEDID"function" => "reciprocal_by_source_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Virtual"), "description" => _("<p>Return the reciprical of the specified feed. Returns NULL for zero values.</p>")), array("name" => _("EXIT"), "short" => "EXIT""argtype" => ProcessArg::NONE"function" => "error_found""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Hidden"), "description" => _("<p>This was automaticaly added when a loop error was discovered on the processList or execution took too many steps to process.  Review the usage of GOTOs or decrease the number of items and delete this entry to resume execution.</p>"), "internalerror" => true"internalerror_reason" => "HAS ERRORS""internalerror_desc" => "Processlist disabled due to errors found during execution."), array("name" => _("Max value allowed"), "short" => "<max""argtype" => ProcessArg::VALUE"function" => "max_value_allowed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Limits"), "description" => _("<p>If value is greater than <i>max value allowed</i> then the value passed to following process will be the <i>max value allowed</i></p>"), "requireredis" => false"nochange" => false), array("name" => _("Min value allowed"), "short" => ">min""argtype" => ProcessArg::VALUE"function" => "min_value_allowed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Limits"), "description" => _("<p>If value is lower than <i>min value allowed</i> then the value passed to following process will be the <i>min value allowed</i></p>"), "requireredis" => false"nochange" => false), array("name" => _("Absolute value"), "short" => "abs""argtype" => ProcessArg::VALUE"function" => "abs_value""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Calibration"), "description" => _("<p>Return the absolute value of the current value. This can be useful for calibrating a particular variable on the web rather than by reprogramming hardware.</p>")), array("name" => _("kWh Accumulator"), "short" => "kwhacc""argtype" => ProcessArg::FEEDID"function" => "kwh_accumulator""datafields" => 1"datatype" => DataType::REALTIME"unit" => "kWh""group" => _("Main"), "engines" => array(Engine::PHPFINAEngine::PHPTIMESERIES), "requireredis" => true"description" => _("<b>kWh Accumulator:</b>This processor removes resets from a cumulative kWh input, it also filter's out spikes in energy use that are larger than a max power threshold set in the processor, assuming these are error's, the max power threshold is set to 25kW. <br><br><b>Visualisation tip:</b> Feeds created with this input processor can be used to generate daily kWh data using the BarGraph visualisation with the delta property set to 1 and scale set to 0.001. See: <a href='https://guide.openenergymonitor.org/setup/daily-kwh/' target='_blank' rel='noopener'>Guide: Daily kWh</a><br><br>")), array("name" => _("Log to feed (Join)"), "short" => "log_join""argtype" => ProcessArg::FEEDID"function" => "log_to_feed_join""datafields" => 1"datatype" => DataType::REALTIME"unit" => """group" => _("Main"), "engines" => array(Engine::PHPFINAEngine::PHPFIWAEngine::PHPTIMESERIESEngine::MYSQLEngine::MYSQLMEMORYEngine::CASSANDRA), "nochange" => true"description" => _("<p><b>Log to feed (Join):</b> In addition to the standard log to feed process, this process links missing data points with a straight line between the newest value and the previous value. It is designed for use with total cumulative kWh meter reading inputs, producing a feed that can be used with the delta property when creating bar graphs. See: <a href='https://guide.openenergymonitor.org/setup/daily-kwh/' target='_blank' rel='noopener'>Guide: Daily kWh</a><br><br>")), array("name" => _("max by input"), "short" => "max_inp""argtype" => ProcessArg::INPUTID"function" => "max_input""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Input"), "description" => _("<p>Limits the current value by the last value from an input as selected from the input list. The result is passed back for further processing by the next processor in the processing list.</p>")), array("name" => _("min by input"), "short" => "min_inp""argtype" => ProcessArg::INPUTID"function" => "min_input""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Input"), "description" => _("<p>Limits the current value by the last value from an input as selected from the input list. The result is passed back for further processing by the next processor in the processing list.</p>")), array("name" => _("max by feed"), "short" => "max_feed""argtype" => ProcessArg::FEEDID"function" => "max_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Feed"), "description" => _("<p>Limits the current value by the last value from an feed as selected from the feed list. The result is passed back for further processing by the next processor in the processing list.</p>")), array("name" => _("min by feed"), "short" => "min_feed""argtype" => ProcessArg::FEEDID"function" => "min_feed""datafields" => 0"datatype" => DataType::UNDEFINED"unit" => """group" => _("Feed"), "description" => _("<p>Limits the current value by the last value from an feed as selected from the feed list. The result is passed back for further processing by the next processor in the processing list.</p>")))
/Lib/misc/nav_functions.php:5121if(is_array($item) && (!empty($item['id']) || !empty($item['path']) || !empty($item['href']) || !empty($item['icon']) || !empty($item['text']) || !empty($item['title']))) { /**/ }
/Lib/misc/nav_functions.php:4981if($_path === implode($slasharray_filter(array($route->controller$route->action$route->subaction$route->subaction2))) || $_path === implode($slasharray_filter(array($route->controller$route->action))) . $q || $_active === implode($slasharray_filter(array($route->controller)))) { /**/ }
/Modules/feed/engine/MysqlTimeSeries.php:1351if(!is_dir($this->dir) || !is_writable($this->dir) || (is_file($this->dir $file) and !is_writable($this->dir $file))) { /**/ }